#include "stdlib.h"
#include "assert.h"
#include "err.h"
#include "pila.h"
   
/* Estructura del TAD */
struct sstack{
	salpha *arreglo;	
	int tam_max;	
	int tam;	
};

/* Constructor */
stack stack_create(const size_t max){
	stack s;
        assert(max > 0);
	s = (stack)calloc(1,sizeof(struct sstack));
	if (s != NULL){
		s->tam_max = max;
		s->tam = 0;
		s->arreglo = (salpha*)calloc(max,sizeof(salpha));
		if (s->arreglo == NULL){
			free(s);
			s = NULL;
                        errx(EXIT_FAILURE,"No hay memoria disponible");
		}
	}
        else errx(EXIT_FAILURE,"No hay memoria disponible");
	return s;
}

/* Apilar un elemento */
void stack_push(stack s,salpha e){
	assert(s != NULL && s->tam < s->tam_max);
	s->arreglo[s->tam] = e;
	s->tam = s->tam + 1;
}

/* Devuelve el primero */
salpha stack_top(stack s){
	salpha e;
	assert(s != NULL); 
        assert(!stack_vacia(s));
	e = s->arreglo[s->tam - 1];
	return e;
}

/* Desapila un elemento */
void stack_pop(stack s){
	assert(s != NULL);
        assert(!stack_vacia(s));
	s->tam = s->tam - 1;
}

/* Devuelve True si es vacía */
Bool stack_vacia(stack s){
	assert(s != NULL);
	return (s->tam == 0);
}

/* Destructor */
stack stack_destroy(stack s){
	assert(s != NULL);
	free(s->arreglo);
        s->arreglo = NULL;
	free(s);
        s = NULL;
	return s;
}
